package com.woniuxy.portal.controller;

import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.woniuxy.portal.common.Result;
import com.woniuxy.portal.common.constant.RedisConstant;
import com.woniuxy.portal.entity.Book;
import com.woniuxy.portal.service.IBookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author 作者
 * @since 2023-09-15
 */
@RestController
@RequestMapping("/book")
public class BookController {

    @Autowired // 默认byType注入。自动去容器中找IBookService这个类型的对象注入。
    private IBookService bookService;
    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 首页查询图书Top10
     * 改造：从Redis中获取zset集合中数据，按照分值降序获取。
     */
    @GetMapping("/top10List")
    public Result top10List(){
        // 参数1：zset的key；参数2：分值的范围（开始）；参数3：分值的范围（结束）
        // 参数4：获取元素的起始位置； 参数5：返回的行数
        Set<ZSetOperations.TypedTuple> datas =
                redisTemplate.opsForZSet().reverseRangeByScoreWithScores(
                        RedisConstant.BOOK_LIST,0,Double.MAX_VALUE,0,10);
        // 处理结果: 把zset返回的数据，转换为List<Book>
        List<Book> bookList = datas.stream().map(data -> {
            // 把Map数据转换为json字符串
            String jsonString = JSONUtil.toJsonStr(data.getValue());
            // 把json字符串转换为Book对象返回
            return JSONUtil.toBean(jsonString,Book.class);
        }).collect(Collectors.toList());

        return Result.ok(bookList);
    }

    /**
     * 根据typeId分页查询图书
     */
    @GetMapping("/list")
    public Result list(Integer typeId, Integer pageNum, Integer pageSize){
        IPage<Book> page = bookService.findByType(typeId,pageNum,pageSize);
        return Result.ok(page);
    }

    /**
     * 根据typeId分页查询图书
     */
    @GetMapping
    @Cacheable(cacheNames = "books",key = "#bookId")
    public Result findById(Integer bookId){
        Book book = bookService.getById(bookId);
        return Result.ok(book);
    }

    /**
     * 首页搜索
     */
    @GetMapping("/search")
    public Result search(
            String keyword,
            @RequestParam(defaultValue = "1") Integer pageNum,
            @RequestParam(defaultValue = "5") Integer pageSize) {
        // 调用service查询索引库
        Map<String,Object> result = bookService.search(keyword,pageNum,pageSize);
        return Result.ok(result);
    }
}
